// 题目描述
// 讨论 (155)
// 46. 全排列
// 中等
// 61
// 给定一个不含重复数字的整数数组 nums ，返回其 所有可能的全排列 。可以 按任意顺序 返回答案。
//   示例 1：
// 输入：nums = [1,2,3]
// 输出：[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
// 示例 2：
// 输入：nums = [0,1]
// 输出：[[0,1],[1,0]]
// 示例 3：
// 输入：nums = [1]
// 输出：[[1]]
//   提示：
// 1 <= nums.length <= 6
// -10 <= nums[i] <= 10
// nums 中的所有整数 互不相同
//   注意：本题与主站 46 题相同：https://leetcode-cn.com/problems/permutations/
// 通过次数
// 29.8K
// 提交次数
// 34.7K
// 通过率
// 85.8%
// https://leetcode.cn/problems/VvJkup/

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {
  const res = []
  const helper = (subset, res, nums, set) => {
    if (subset.length === nums.length) {
      res.push(subset.slice())
    }

    for (const num of nums) {
      if (set.has(num)) {
        continue
      }
      subset.push(num)
      set.add(num)
      helper(subset, res, nums, set)
      subset.pop()
      set.delete(num)
    }
  }
  helper([], res, nums, new Set())

  return res
}

console.log(
  permute([1, 2, 3])
)
